import Singleton from '../Base/Singleton';
import { _decorator, Asset, instantiate, Node } from 'cc';
import { EntityTypeEnum } from '../Common';
import DataManager from './DataManager';

/**
 * 在创建预制体的时候使用
 * 用对象池来统一管理子弹的销毁和爆炸,
 * 一级节点：总节点objectPool
 * 二级节点是BulletPool和ExplosionPool
 * 三级是子弹和爆炸节点
 */
export class ObjectPoolManager extends Singleton {
    static get Instance() {
        return super.GetInstance<ObjectPoolManager>();
    }
    //
    private objectPool:Node
    //这个map原来维护当前使用的节点,key是实体类型，value是节点数组
    private map:Map<EntityTypeEnum,Node[]> =new Map()

    get(type:EntityTypeEnum){
        //先判断有没一级节点，没有就创建他
        if(!this.objectPool){
            this.objectPool = new Node("ObjectPool")
            this.objectPool.setParent(DataManager.Instance.stage)
        }
        //判断有没有二级节点,判断map里面有没有节点名称,没有就添加
        if(!this.map.has(type)){
            this.map.set(type,[])
            const container = new Node(type+'Pool')
            container.setParent(this.objectPool)
        }
        //获取逻辑,先从map中获取节点数组，看看数组里有没有爆炸或子弹的预制体，没有就实例化
        //nodes 只存“闲置”节点，不用存“正在用”的节点。
        const nodes = this.map.get(type)
        if(!nodes.length){
            const prefab =  DataManager.Instance.prefabMap.get(type)
            const node = instantiate(prefab)
            node.name = type
            node.setParent(this.objectPool.getChildByName(type+'Pool')) //给节点设置父节点
            node.active = true
            return node
        }else{
            //否则直接从对象池里拿一个出来
            const node = nodes.pop()
            node.active = true
            return node
        }
    }
    //节点要“销毁”时归还节点给nodes
    ret(node:Node){
        node.active = false
        this.map.get(node.name as EntityTypeEnum).push(node)
    }
    reset() {
        this.objectPool = null;
        this.map.clear();
    }

}
